package pub.cleangao.mybatis.meta;

import lombok.Data;

import java.io.Serializable;


/**
 * 数据库列字段对应
 */
@Data
public class ColumnDefinition implements Serializable {

    // java 字段名称
    String fieldName;
    // java 字段类型
    String fieldType;
    // java 字段类型(全路径)
    String fieldFullType;
    // jdbcType
    String jdbcType;
    // 列名
    String columnName;
    // 是否是主键
    boolean primaryKey = false;
    // 主键是否自增
    boolean pkAutoIncrease = false;
    // 按照序列生成主键
    String keySeqName;
    // 主键是否使用数据库UUID
    boolean pkUUID = false;
    // 主键使用手动设置值
    boolean pkManual = false;
    // 是否是乐观锁字段
    boolean version = false;
    // 是否是逻辑删除字段
    boolean logicDelete = false;
    // 逻辑删除默认值（未删除时）
    String logicDeleteDefault;
    // 逻辑删除设置值（已删除时）
    String logicDeletedValue;
    // 是否自动填充时间戳
    boolean dateTimeType;
    boolean autoFillTimeStamp = false;
    // 时间类型, 0:日期时间 1:日期 2:时间
    int timeType = 0;
    // 分库参考字段作为参数索引
    int cleavageParamIndex = -1;


    public boolean getPrimaryKey() {
        return primaryKey;
    }

    public boolean getPkAutoIncrease() {
        return pkAutoIncrease;
    }

    public boolean getPkUUID() {
        return pkUUID;
    }

    public boolean getPkManual() {
        return pkManual;
    }

    public boolean getVersion() {
        return version;
    }

    public boolean getLogicDelete() {
        return logicDelete;
    }

    public boolean getAutoFillTimeStamp() {
        return autoFillTimeStamp;
    }

    public boolean getDateTimeType() {
        return dateTimeType;
    }

    public void calcIfDateTime() {
        switch (this.fieldType) {
            case "LocalDate", "Time", "Date", "Timestamp", "Instant", "LocalDateTime", "OffsetDateTime", "ZonedDateTime" -> {
                // 统一设置为0(datetime)
                this.setTimeType(0);
                this.setDateTimeType(true);
            }
            default -> this.setDateTimeType(false);
        }
        // 对统一设置为0的时间形式修正
        if ("LocalDate".equals(this.fieldType)) {
            this.setTimeType(1);
        }
        if ("Time".equals(this.fieldType)) {
            this.setTimeType(2);
        }
    }
}
